/*-------------------------------------------------------------------------
 *
 * reltrigger.h
 *	  POSTGRES 关系触发器定义。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/utils/reltrigger.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef RELTRIGGER_H
#define RELTRIGGER_H


/*
 * 这些结构实际上属于 trigger.h，但我们单独放置它们，以便可以
 * 干净地包含在 rel.h 和其他地方。
 */

typedef struct Trigger
{
	Oid			tgoid;			/* 触发器的 OID (pg_trigger 行) */
	/* 剩余字段从 pg_trigger 复制，请参见 pg_trigger.h */
	char	   *tgname;
	Oid			tgfoid;
	int16		tgtype;
	char		tgenabled;
	bool		tgisinternal;
	bool		tgisclone;
	Oid			tgconstrrelid;
	Oid			tgconstrindid;
	Oid			tgconstraint;
	bool		tgdeferrable;
	bool		tginitdeferred;
	int16		tgnargs;
	int16		tgnattr;
	int16	   *tgattr;
	char	  **tgargs;
	char	   *tgqual;
	char	   *tgoldtable;
	char	   *tgnewtable;
} Trigger;

typedef struct TriggerDesc
{
	Trigger    *triggers;		/* Trigger 结构的数组 */
	int			numtriggers;	/* 数组条目的数量 */

	/*
	 * 这些标志指示数组中是否至少包含每种类型的一个触发器。我们使用
	 * 这些来跳过搜索数组，如果没有的话。
	 */
	bool		trig_insert_before_row;
	bool		trig_insert_after_row;
	bool		trig_insert_instead_row;
	bool		trig_insert_before_statement;
	bool		trig_insert_after_statement;
	bool		trig_update_before_row;
	bool		trig_update_after_row;
	bool		trig_update_instead_row;
	bool		trig_update_before_statement;
	bool		trig_update_after_statement;
	bool		trig_delete_before_row;
	bool		trig_delete_after_row;
	bool		trig_delete_instead_row;
	bool		trig_delete_before_statement;
	bool		trig_delete_after_statement;
	/* 没有行级截断触发器 */
	bool		trig_truncate_before_statement;
	bool		trig_truncate_after_statement;
	/* 是否至少有一个触发器指定每个转移关系？ */
	bool		trig_insert_new_table;
	bool		trig_update_old_table;
	bool		trig_update_new_table;
	bool		trig_delete_old_table;
} TriggerDesc;

#endif							/* RELTRIGGER_H */
